package com.qf.hospital.controller;

import com.github.pagehelper.PageInfo;
import com.qf.hospital.DTO.AddRoleDTO;
import com.qf.hospital.DTO.SysRoleDTO;
import com.qf.hospital.VO.MenuDTreeVO;
import com.qf.hospital.VO.R;
import com.qf.hospital.VO.SysRoleVO;
import com.qf.hospital.entity.SysRole;
import com.qf.hospital.enums.HospitalExceptionEnum;
import com.qf.hospital.service.SysRoleService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 何星宇
 * @version V1.0
 * @Date 2021/10/18 20:41
 */

@RestController
public class RoleController {
    private Logger log = LoggerFactory.getLogger(RoleController.class);
    @Autowired
    private SysRoleService sysRoleService;

    /**
     * 条件查询所有角色
     * @param rolename
     * @param roledesc
     * @param available
     * @param page
     * @param limit
     * @return
     */
    @GetMapping("/role/loadAllRole")
    public R findAllRole(String rolename ,
                         String roledesc ,
                         Integer available,
                         @RequestParam(defaultValue = "1")Integer page,
                         @RequestParam(defaultValue = "10")Integer limit){
        //条件查询
        PageInfo<SysRole> pageInfo =  sysRoleService.findRoleByCondition(rolename,roledesc,available,page,limit);

        //数据总数
        long count = pageInfo.getTotal();
        //封装数据

        List<SysRoleVO> data = new ArrayList<>();
        List<SysRole> roleList = pageInfo.getList();
        for (SysRole sysRole : roleList) {
            SysRoleVO sysRoleVO = new SysRoleVO();
            BeanUtils.copyProperties(sysRole, sysRoleVO);
            data.add(sysRoleVO);
        }
        return R.ok(data, count);
    }

    /**
     * 修改角色信息
     * @param sysRoleDTO
     * @param bindingResult
     * @return
     */
    @PostMapping("/role/updateRole")
    public R updateRole(@Valid SysRoleDTO sysRoleDTO , BindingResult bindingResult){
        if (bindingResult.hasErrors()){
            //记录日志
            log.info("【修改角色信息】 参数不合法");
            return R.error(HospitalExceptionEnum.INVALID_PARAMETER,bindingResult.getFieldError().getDefaultMessage());
        }
        sysRoleService.update(sysRoleDTO);
        return R.ok("修改成功");
    }

    /**
     * 添加角色信息
     * @param addRoleDTO
     * @param bindingResult
     * @return
     */
    @PostMapping("/role/insertRole")
    public R insertRole(@Valid AddRoleDTO addRoleDTO , BindingResult bindingResult){
        if (bindingResult.hasErrors()){
            //记录日志
            log.info("【添加角色信息】 参数不合法");
            return R.error(HospitalExceptionEnum.INVALID_PARAMETER,bindingResult.getFieldError().getDefaultMessage());
        }
        sysRoleService.insertRole(addRoleDTO);
        return R.ok("添加成功");
    }

    /**
     * 删除角色信息
     * @param roleid
     * @return
     */
    @PostMapping("/role/deleteRole")
    public R deleteRole(Integer roleid){
        if (roleid==null){
            //记录日志
            log.info("【删除角色信息】 参数不合法");
            return R.error(HospitalExceptionEnum.INVALID_PARAMETER,"角色id为必填项");
        }
        sysRoleService.deleteRole(roleid);
        return R.ok("删除成功");
    }

    /**
     * 分配角色菜单
     * @param roleid
     * @return
     */
    @PostMapping("/role/initRoleMenuTreeJson")
    public R initRoleMenu(Integer roleid){
        //校验
        if (roleid==null){
            //记录日志
            log.info("【分配角色菜单】 角色id为必填项");
            return R.error(HospitalExceptionEnum.INVALID_PARAMETER,"角色id为必填项");
        }
        //调用service获取数据
        List<MenuDTreeVO> data = sysRoleService.initRoleMenuByRoleId(roleid);
        return R.ok(data);
    }

    /**
     * 保存角色菜单
     * @param roleid
     * @param ids
     * @return
     */
    @PostMapping("/role/saveRoleMenu")
    public R saveRoleMenu(Integer roleid , Integer[] ids){
        //校验
        if (roleid==null){
            //记录日志
            log.info("【保存角色菜单】 角色id为必填项");
            return R.error(HospitalExceptionEnum.INVALID_PARAMETER,"角色id为必填项");
        }
        //调用service修改数据
        sysRoleService.insertRoleMenu(roleid,ids);
        return R.ok("修改成功");
    }
}
